#include "fourconnecttype.h"

FourConnectType::FourConnectType()
{
    showAutoConnect();
}

void FourConnectType::showAutoConnect()
{
    // 1.信号发送线程 = 接收者所属线程 → 同步调用
    qDebug() << "send sig_autoConnect_one"<< QThread::currentThread();

    connect(this,&FourConnectType::sig_autoConnect_one,this,[=](){
        qDebug() <<  "1.信号发送线程 = 接收者所属线程 → 同步调用" << QThread::currentThread();
    },Qt::AutoConnection);

    emit sig_autoConnect_one();

    // 2.信号发送线程（主线程） ≠ 接收者所属线程（子线程） → 异步调用
    // 错误：
    // qDebug() << QThread::currentThread();
    // QThread workerThread;

    // moveToThread(&workerThread);
    // workerThread.setObjectName("workerThread");
    // workerThread.start();

    // 这样还是同步，workerThread 是thread 的管理者还是属于Main线程
    // connect(this,&FourConnectType::sig_autoConnect_two,&workerThread,[=](){
    //     qDebug() <<  "2.信号发送线程（主线程） ≠ 接收者所属线程（子线程） → 异步调用" << QThread::currentThread();
    // },Qt::AutoConnection);
    // emit sig_autoConnect_two();
    // workerThread.wait();

    qDebug() << "send sig_autoConnect_two "<< QThread::currentThread();
    QThread workerThread;
    workerThread.setObjectName("workerThread");
    QObject* receiver = new QObject();      // 这里就不要传this了

    receiver->moveToThread(&workerThread);
    workerThread.start();

    connect(this,&FourConnectType::sig_autoConnect_two,receiver,[=](){
        qDebug() <<  "2.信号发送线程（主线程） ≠ 接收者所属线程（子线程） → 异步调用" << QThread::currentThread();
    });

    emit sig_autoConnect_two();
    workerThread.msleep(500);   // 注意等待
    workerThread.quit();        // 注意退出一下，不然阻塞在这里
    workerThread.wait();

    // 3. 对象同线程但信号跨线程发送（异步）
    // 错误：
    // QThread thread;
    // thread.setObjectName("thread");
    // qDebug() << "send sig_autoConnect_thread "<< thread.currentThread();
    // connect(this,&FourConnectType::sig_autoConnect_three,this,[=](){
    //    qDebug() << "3.信号发送线程（子线程） ≠ 接收者所属线程（主线程） → 异步调用" << QThread::currentThread();
    // },Qt::AutoConnection);
    // connect(&thread,&QThread::started,this,&FourConnectType::sig_autoConnect_three,Qt::AutoConnection);
    // thread.start();
    // thread.wait();

    QThread thread;
    thread.setObjectName("thread");
    QObject* threadReceiver = new QObject;
    threadReceiver->moveToThread(&thread);

    // 子线程内部同步调用
    // 这样可以 : 但是不过直观说明这个信号由子线程发出
    // connect(&thread, &QThread::started, this,&FourConnectType::sig_autoConnect_three);
    // 优化一下
    connect(&thread, &QThread::started, threadReceiver, [=](){
        qDebug() << "3.1 信号发送线程（子线程） == 接收者所属线程（子线程）→ 同步调用"
                 << QThread::currentThread();
        emit sig_autoConnect_three();
    }, Qt::DirectConnection);

    // 主线程接收异步调用
    connect(this, &FourConnectType::sig_autoConnect_three, this, [=](){
        qDebug() << "3.2 信号发送线程（子线程） ≠ 接收者所属线程（主线程） → 异步调用"
                 << QThread::currentThread();
    }, Qt::AutoConnection);

    thread.start();
    thread.quit();
    thread.wait();
    delete threadReceiver;
}
